Aller au contenu principal

📩 5.2B – firebase_datastore_setup

Objectif 🎯​

Apprendre à structurer et gérer des données avec Firestore (la base de données NoSQL orientée documents de Firebase).

À faire đŸ› ïžâ€‹

PrĂ©requis​

Avoir complété la configuration Firebase de base avec firebase_core et google_sign_in.

Étape 14 - Tester l'accùs à Firestore (optionnel)​

Pour vérifier que tout fonctionne correctement:

  • Allez Ă  la console Firebase
  • CrĂ©ez une base de donnĂ©es Firestore en mode test
  • Dans votre main.dart, remplacez la fonction _incrementCounter() avec:
void _incrementCounter() {
final db = FirebaseFirestore.instance;
final user = <String, dynamic>{
"first": "Ada",
"last": "Lovelace",
"born": 1815
};
db.collection("users").add(user).then((DocumentReference doc) =>
print('DocumentSnapshot added with ID: ${doc.id}')
);
setState(() {
_counter++;
});
}
  • Lancez l'application
  • Appuyez sur le bouton +
  • Allez Ă  la console Firebase dans le volet Firestore
  • Vous devriez voir les donnĂ©es apparaĂźtre!

COMMIT et PUSH.

Étape 1 - Installation de cloud_firestore​

flutter pub add cloud_firestore
flutterfire configure

Faites un COMMIT PUSH.

Étape 2 - CrĂ©ation d'une base de donnĂ©es Firestore​

  • Allez dans la console Firebase
  • SĂ©lectionnez votre projet
  • Dans le panneau Ă  gauche, cliquez sur Firestore Database
  • Cliquez sur CrĂ©er une base de donnĂ©es
  • SĂ©lectionnez le mode test (permet de lire/Ă©crire sans rĂšgles de sĂ©curitĂ©)
  • Choisissez votre rĂ©gion (par dĂ©faut c'est fine)
  • Cliquez sur CrĂ©er

Étape 3 - Comprendre la structure Firestore​

Firestore est orienté documents, pas relationnel comme SQL:

  • Collections: Conteneurs de documents (comme des tables)
  • Documents: Objets JSON avec un ID unique
  • Subcollections: Collections imbriquĂ©es dans un document
  • Champs: PropriĂ©tĂ©s des documents

Exemple de structure:

users/
├── user1 (document)
│ ├── name: "Alice"
│ ├── email: "alice@example.com"
│ └── posts/ (subcollection)
│ ├── post1
│ └── post2
└── user2 (document)

Étape 4 - CrĂ©er une collection manuellement​

Dans la console Firestore:

  • Cliquez sur + CrĂ©er une collection
  • Nommez-la users
  • Cliquez sur Suivant
  • Cliquez sur Ajouter un document et remplissez manuellement:
    • ID: user1 (personnalisĂ©)
    • Champs:

Ajoutez quelques documents Ă  votre collection pour tester.

Étape 5 - AccĂ©der aux donnĂ©es en Flutter​

Dans un StatefulWidget, créez une méthode pour récupérer les données:

Future<List<Map<String, dynamic>>> getUsers() async {
final db = FirebaseFirestore.instance;
final snapshot = await db.collection('users').get();

return snapshot.docs.map((doc) => doc.data()).toList();
}

Dans la UI, utilisez un FutureBuilder pour afficher les données:

FutureBuilder<List<Map<String, dynamic>>>(
future: getUsers(),
builder: (context, snapshot) {
if (snapshot.hasError) {
return Text('Erreur: ${snapshot.error}');
}

if (!snapshot.hasData) {
return Text('Chargement...');
}

final users = snapshot.data!;
return ListView.builder(
itemCount: users.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(users[index]['name']),
subtitle: Text(users[index]['email']),
);
},
);
},
)

Testez l'affichage de vos données.

Faites un COMMIT PUSH.

Étape 6 - Ajouter des donnĂ©es en Flutter​

Créez une méthode pour ajouter un nouvel utilisateur:

Future<void> addUser(String name, String email, int age) async {
final db = FirebaseFirestore.instance;

await db.collection('users').add({
'name': name,
'email': email,
'age': age,
});
}

Utilisez add() pour générer un ID automatiquement, ou set() si vous avez un ID spécifique:

await db.collection('users').doc('user123').set({
'name': 'Bob',
'email': 'bob@example.com',
});

Ajoutez un bouton pour insérer des données et vérifiez dans la console Firebase.

Faites un COMMIT PUSH.

Étape 7 - Utiliser StreamBuilder pour les mises Ă  jour en temps rĂ©el​

Au lieu de récupérer les données une seule fois, utilisez snapshots() pour écouter les changements:

StreamBuilder<QuerySnapshot>(
stream: FirebaseFirestore.instance.collection('users').snapshots(),
builder: (context, snapshot) {
if (snapshot.hasError) {
return Text('Erreur: ${snapshot.error}');
}

if (!snapshot.hasData) {
return Text('Chargement...');
}

final users = snapshot.data!.docs;
return ListView.builder(
itemCount: users.length,
itemBuilder: (context, index) {
final user = users[index].data() as Map<String, dynamic>;
return ListTile(
title: Text(user['name']),
subtitle: Text(user['email']),
);
},
);
},
)

Testez en ajoutant des documents dans la console Firebase — ils apparaĂźtront en temps rĂ©el!

Étape 8 - Mettre à jour et supprimer​

Pour mettre Ă  jour un document:

await db.collection('users').doc('user1').update({
'age': 26,
});

Pour supprimer un document:

await db.collection('users').doc('user1').delete();

Ajoutez des boutons pour tester ces opérations.

Faites un COMMIT PUSH.

Étape 9 - Filtrer et trier les donnĂ©es​

Vous pouvez filtrer les résultats avec where():

final query = db
.collection('users')
.where('age', isGreaterThan: 18)
.orderBy('age', descending: true);

final snapshot = await query.get();

Testez diffĂ©rentes requĂȘtes pour comprendre le fonctionnement.

Points clĂ©s Ă  retenir​

  • ✅ Firestore est NoSQL et orientĂ© documents
  • ✅ Les collections sont flexibles (pas de schĂ©ma rigide)
  • ✅ Utilisez StreamBuilder pour les mises Ă  jour en temps rĂ©el
  • ✅ Chaque requĂȘte Ă  Firestore coĂ»te des "lectures" (attention aux quotas gratuits!)
  • ✅ Structurez vos donnĂ©es intelligemment (denormalization vs sous-collections)